/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package model;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

/**
 *
 * @author Morten J, Morten B & Jonas
 */
public class Faktura {

    private int fakturaNr;
    private int betalingsType;
    private boolean medlem;
    private Ansat ansat;
    private ArrayList<FaktureretVare> faktureretVareListe;
    private long dato;
    private double totalInvoice;
    private String valuta;

    public Faktura(int fakturaNr, Ansat ansat, ArrayList<FaktureretVare> faktureretVareListe) {
	this.fakturaNr = fakturaNr;
	this.ansat = ansat;
	this.faktureretVareListe = faktureretVareListe;
	this.dato = System.currentTimeMillis() / 1000L;
	this.betalingsType = 1;
	this.medlem = false;
    }

    public Ansat getAnsat() {
	return ansat;
    }

    public double getTotalInvoice() {
	return totalInvoice;
    }

    public boolean isMedlem() {
	return medlem;
    }

    public void setMedlem(boolean medlem) {
	this.medlem = medlem;
    }

    public void setBetalingsType(int betalingsType) {
	this.betalingsType = betalingsType;
    }

    public int getBetalingsType() {
	return betalingsType;
    }

    public void setDato(long dato) {
	this.dato = dato;
    }

    public long getDato() {
	return dato;
    }

    public String getDatoAsDate() {
	long longDato = dato * 1000;
	SimpleDateFormat d = new SimpleDateFormat();
	String dayStr;
	d.applyPattern("u");
	int day = Integer.parseInt(d.format(new Date(longDato)));
	switch (day) {
	    case 1:
		dayStr = "Man";
		break;
	    case 2:
		dayStr = "Tirs";
		break;
	    case 3:
		dayStr = "Ons";
		break;
	    case 4:
		dayStr = "Tors";
		break;
	    case 5:
		dayStr = "Fre";
		break;
	    case 6:
		dayStr = "Lør";
		break;
	    default:
		dayStr = "Søn";
	}
	dayStr += "dag";
	String res;
	d.applyPattern("dd-MM-Y HH:mm");
	res = d.format(new Date(longDato));
	return dayStr + " " + res;
    }

    public ArrayList<FaktureretVare> getFaktureretVareListe() {
	return faktureretVareListe;
    }

    public int getFakturaNr() {
	return fakturaNr;
    }

    private String toStrFaktureretVare(Varegruppe varegruppe) {
	String fakturaInfo = "";
	boolean vgFindes = false;
	String vgNavn = varegruppe.getVareGruppeNavn();
	ArrayList<FaktureretVare> vgList = new ArrayList<>();

	for (FaktureretVare faktureretVare : faktureretVareListe) {
	    if (varegruppe.getVareGruppeNr() == faktureretVare.getVare().getVareGruppe().getVareGruppeNr()) {
		vgList.add(faktureretVare);
		vgFindes = true;
	    }
	}
	if (vgFindes) {
	    fakturaInfo = fakturaInfo + "\n-- " + vgNavn + " --";
	    for (FaktureretVare fkV : vgList) {
		fakturaInfo = fakturaInfo + toStrFaktureretList(fkV);
	    }
	}
	return fakturaInfo;
    }

    private String toStrFaktureretList(FaktureretVare fkV) {
	String fakturaInfo = "";
	double rabatPris;
	double pris;
	double salgsPris;
	String rabatLinie = "";
	int antalSize;
	if (fkV.getAntal() < 10) {
	    antalSize = 1;
	} else if (fkV.getAntal() < 100) {
	    antalSize = 2;
	} else if (fkV.getAntal() < 1000) {
	    antalSize = 3;
	} else {
	    antalSize = 4;
	}

	if (betalingsType == 2) {
	    valuta = "€";
	    pris = fkV.getVare().getSalgsPrisEu();
	    salgsPris = fkV.getVare().getSalgsPrisEu();
	} else {
	    valuta = "kr.";
	    pris = fkV.getVare().getSalgsPrisKr();
	    salgsPris = fkV.getVare().getSalgsPrisKr();
	}

	fakturaInfo = fakturaInfo + "\n\t" + fkV.getAntal() + "x " + fkV.getVare().getVareNavn() + "\t";
	for (int i = 0; i < 3 - ((fkV.getVare().getVareNavn().length() + antalSize + 2) / 8); i++) {
	    fakturaInfo = fakturaInfo + "\t";
	}

	if (medlem && fkV.getVare().isMedlemsPris()) {
	    pris = pris * 0.9;
	    rabatPris = pris - salgsPris;
	    rabatLinie = "\n\t\tMEDLEMSRABAT\t\t" + (Math.round(rabatPris * fkV.getAntal() * 100) / 100.0) + " " + valuta;
	}
	fakturaInfo = fakturaInfo + (Math.round(((salgsPris * fkV.getAntal()) * 100.0)) / 100.0) + " " + valuta + rabatLinie;
	totalInvoice = totalInvoice + (pris * fkV.getAntal());
	return fakturaInfo;
    }

    @Override
    public String toString() {
	String fakturaInfo = "";
	totalInvoice = 0;
	ArrayList<Varegruppe> vgList = new ArrayList<>();
	for (FaktureretVare faktureretVare : faktureretVareListe) {
	    if (!vgList.contains(faktureretVare.getVare().getVareGruppe())) {
		vgList.add(faktureretVare.getVare().getVareGruppe());
		String sorteretFaktureretVare = toStrFaktureretVare(faktureretVare.getVare().getVareGruppe());
		fakturaInfo = fakturaInfo + sorteretFaktureretVare;
	    }
	}

	fakturaInfo = fakturaInfo + "\n\nAt betale: " + (Math.round(totalInvoice * 100.0) / 100.0)
		+ " " + valuta + "\nFakturanummer: " + fakturaNr
		+ "\nBetjent af: " + ansat + "\nDato: " + getDatoAsDate();
	return fakturaInfo;
    }
}
